package com.yuexunit.account.action.v2;

import java.util.List;

import com.yuexunit.account.action.v2.model.Account;
import com.yuexunit.account.action.v2.model.AccountAlias;
import com.yuexunit.account.action.v2.model.Session;
import com.yuexunit.account.action.v2.model.VerifyCodeType;
import com.yuexunit.account.context.Version2_1;
import com.yuexunit.web.annotation.Action;
import com.yuexunit.web.annotation.Parameter;


/**
 * 帐号中心对外提供的接口
 * 
 * @author wangjinshui
 */
public interface AccountActionApi {
	/**
	 * 创建帐号信息，身份证号、手机、邮箱都为登录名 身份证号、手机、邮箱必须有一个非空
	 * 
	 * @param fullName 姓名
	 * @param idCardNo 身份证号
	 * @param mobile 手机
	 * @param email 邮箱
	 * @param password 密码
	 */
	@Action(version=Version2_1.class, description="创建帐号：身份证、手机、邮箱都为必输项。")
	@Parameter(name="accountId", description="帐号ID")
	public Long createAccount(
			@Parameter(name="fullName", description="姓名") String fullName,
			@Parameter(name="idCardNo", description="身份证号码", nullable=true) String idCardNo,
			@Parameter(name="mobile", description="手机", nullable=true) String mobile,
			@Parameter(name="email", description="邮箱", nullable=true) String email,
			@Parameter(name="password", description="密码") String password);
	
	
	/**
	 * 发送短信验证码
	 * 
	 * @param type 验证码类型
	 * @param mobile 手机号码
	 * @param idCardNo 身份证号码
	 */
	@Action(version=Version2_1.class, description="发送短信验证码")
	public void sendVerifyCodeBySms(
			@Parameter(name="type", description="验证码类型：1-注册；2-忘记密码；3-修改手机") VerifyCodeType type,
			@Parameter(name="mobile", description="手机") String mobile,
			@Parameter(name="idCardNo", description="身份证号码") String idCardNo);
	
	
	/**
	 * 校验验证码是否正确，若正确返回true，否则返回false。
	 * 
	 * @param type 验证码类型
	 * @param mobile 手机号码
	 * @param verifyCode 验证码
	 */
	@Action(version=Version2_1.class, description="校验短信验证码")
	@Parameter(name="result", description="true-验证码正确；false-验证码错误")
	public boolean checkVerifyCode(
			@Parameter(name="type", description="验证码类型：1-注册；2-忘记密码；3-修改手机") VerifyCodeType type, 
			@Parameter(name="mobile", description="手机") String mobile, 
			@Parameter(name="verifyCode", description="验证码") String verifyCode);
	
	
	/**
	 * 忘记密码时，重置密码
	 * 
	 * @param idCardNo 身份证号码
	 * @param mobile 手机号码
	 * @param verifyCode 校验码
	 * @param newPassword 新密码
	 */
	@Action(version=Version2_1.class, description="忘记密码时重置密码")
	public void forgetPassword(
			@Parameter(name="idCardNo", description="身份证号码") String idCardNo,
			@Parameter(name="mobile", description="手机") String mobile,
			@Parameter(name="verifyCode", description="验证码") String verifyCode,
			@Parameter(name="newPassword", description="新密码") String newPassword);
	
	
	/**
	 * 用户修改登录手机时，发送短信验证码
	 * 
	 * @param accountId 帐号ID
	 * @param oldPassword 旧密码
	 * @param newMobile 新手机号码
	 */
	@Action(version=Version2_1.class, description="发送短信验证码，用于用户修改登录手机")
	public void changeMobileSms(
			@Parameter(name="accountId", description="帐号ID") Long accountId,
			@Parameter(name="oldPassword", description="旧密码") String oldPassword,
			@Parameter(name="newMobile", description="新手机") String newMobile);
	
	
	/**
	 * 用户修改登录手机
	 * 
	 * @param accountId 帐号ID
	 * @param oldPassword 旧密码
	 * @param newMobile 新手机号码
	 * @param verifyCode 校验码
	 */
	@Action(version=Version2_1.class, description="用户修改登录手机")
	public void changeMobile(
			@Parameter(name="accountId", description="帐号ID") Long accountId,
			@Parameter(name="oldPassword", description="旧密码") String oldPassword,
			@Parameter(name="newMobile", description="新手机") String newMobile,
			@Parameter(name="verifyCode", description="校验码") String verifyCode);
	
	
	/**
	 * 登录
	 * 
	 * @param accountName 帐号
	 * @param password 密码
	 * @param appSetting 应用登录参数
	 * @return 会话信息
	 */
	@Action(version=Version2_1.class, description="登录")
	public Session login(
			@Parameter(name="accountName", description="帐号") String accountName,
			@Parameter(name="password", description="密码") String password,
			@Parameter(name="appKey", description="应用代码") String appKey,
			@Parameter(name="appRoleType", description="帐号在应用中的角色类型") Integer appRoleType);
	
	
	/**
	 * 免密码直接登录
	 * 
	 * @param accountId 帐号
	 * @param appSetting 应用登录参数
	 * @return 会话信息
	 */
	@Action(version=Version2_1.class, description="获取帐号的会话信息")
	public Session loginSso(
			@Parameter(name="accountId", description="帐号ID") Long accountId,
			@Parameter(name="appKey", description="应用代码") String appKey,
			@Parameter(name="appRoleType", description="帐号在应用中的角色类型") Integer appRoleType);
	
	
	/**
	 * 根据ID查询帐号信息
	 * 
	 * @param accountId 帐号ID
	 * @return 帐号信息
	 */
	@Action(version=Version2_1.class, description="根据帐号ID查询帐号信息")
	public Account inquireAccountDetail(
			@Parameter(name="accountId", description="帐号ID") Long accountId);
	
	
	/**
	 * 根据Session UUID查询帐号信息
	 * 
	 * @param sessionUuid Session UUID
	 * @return 帐号信息
	 */
	@Action(version=Version2_1.class, description="根据会话ID查询帐号信息")
	public Account inquireAccountDetailBySessionUuid(
			@Parameter(name="sessionUuid", description="会话ID") String sessionUuid);
	
	
	/**
	 * 用户修改密码
	 * 
	 * @param sessionUuid 用户会话ID
	 * @param oldPassword 旧密码
	 * @param newPassword 新密码
	 */
	@Action(version=Version2_1.class, description="用户修改密码")
	public Session changePassword(
			@Parameter(name="sessionUuid", description="会话ID") String sessionUuid,
			@Parameter(name="oldPassword", description="旧密码") String oldPassword,
			@Parameter(name="newPassword", description="新密码") String newPassword);
	

	/**
	 * 用户退出登录
	 * 
	 * @param sessionUuid 会话ID
	 */
	@Action(version=Version2_1.class, description="用户退出登录")
	public void logout(
			@Parameter(name="sessionUuid", description="会话ID") String sessionUuid);
	
	
	/**
	 * @param accountId 帐号ID
	 * @return 帐号名列表
	 */
	@Action(version=Version2_1.class, description="根据帐号ID查询帐号别名列表")
	public List<AccountAlias> inquireAccountAliasList(
			@Parameter(name="accountId", description="帐号ID") Long accountId);
	
	
	/**
	 * 批量删除帐号的登录名
	 * 
	 * @param accountId 帐号ID
	 * @param accountNameList 帐号名列表
	 */
	@Action(version=Version2_1.class, description="批量删除帐号的登录名")
	public void deleteAccountAlias(
			@Parameter(name="accountId", description="帐号ID") Long accountId, 
			@Parameter(name="accountNameList", description="帐号别列表") List<String> accountNameList);
	
	
	/**
	 * 修改帐号的登录名
	 * 
	 * @param accountAlias 帐号登录名
	 */
	@Action(version=Version2_1.class, description="修改帐号的别名")
	public void updateAccountAlias(AccountAlias accountAlias);
}
